package v3

import (
	"crypto"
	"net/url"
	"strconv"
	"time"
)

// 统一下单api POST方式
const WxUnifiedOrderApi = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi"

// 获取平台证书列表
const WxGetCertificatesApi = "https://api.mch.weixin.qq.com/v3/certificates"

// 微信交易
type WxTransactions struct {
	// 应用id （必须）
	Appid string
	//直连商户号 （必须）
	Mchid string
	// 商品描述 （必须）
	Description string
	// 商户订单号 （必须）
	OutTradeNo string
	// 交易结束时间 （可选）
	TimeExpire string `json:",omitempty"`
	// 通知地址 （必须）
	NotifyUrl string
	// 订单优惠标记 （可选）
	GoodsTag string `json:",omitempty"`
	// 订单金额信息 （必须）
	Amount WxAmount
	// 支付者信息 （必须）
	Payer WxPayer
	// 优惠功能 （可选）
	Detail WxDetail `json:",omitempty"`
	// 支付场景描述 （可选）
	SceneInfo WxSceneInfo `json:",omitempty"`
}

// 微信订单金额
type WxAmount struct {
	// 订单总金额，单位为分 (必须)
	Total int
}

// 微信支付者
type WxPayer struct {
	// 必须
	Openid string
}

// 优惠功能
type WxDetail struct {
	// 订单原价 （可选）
	CostPrice int `json:",omitempty"`
	// 商品小票ID （可选）
	InvoiceId string `json:",omitempty"`
	// 单品列表 （可选）
	GoodsDetail []WxGoodDetail `json:",omitempty"`
}

// 单品
type WxGoodDetail struct {
	// 商户侧商品编码 （必须）
	MerchantGoodsId string
	// 微信侧商品编码 (可选)
	WechatpayGoodsId string `json:",omitempty"`
	// 商品名称 (可选)
	GoodsName string `json:",omitempty"`
	// 商品数量 （必须）
	Quantity int
	// 商品单价 （必须）
	UnitPrice int
}

// 支付场景描述
type WxSceneInfo struct {
	// 用户终端IP （必须）
	PayerClientIp string
	// 商户端设备号 （可选）
	DeviceId string `json:",omitempty"`
	// 商户门店信息 （可选）
	StoreInfo WxStoreInfo `json:",omitempty"`
}

// 商户门店信息
type WxStoreInfo struct {
	// 门店编号 （必须）
	Id string
	// 门店名称 （可选）
	Name string `json:",omitempty"`
	// 地区编码 （可选）
	AreaCode string `json:",omitempty"`
	// 详细地址 （可选）
	Address string `json:",omitempty"`
}

func wxBuildMessage(method string, ur *url.URL, timestamp int64, nonceStr, body string) string {
	path := ur.EscapedPath()
	query := ur.RawQuery
	eq := ""
	if query != "" {
		eq = url.QueryEscape(query)
	}
	fi := strconv.FormatInt(timestamp, 10)
	return method + "\n" + path + eq + "\n" + fi + "\n" + nonceStr + "\n" + body + "\n"
}

func wxAuthorizationHeader(privateKey, merchantId, serialNo, method string, ur string, body string) string {
	parse, err := url.Parse(ur)
	if err != nil {
		return ""
	}
	au := "WECHATPAY2-SHA256-RSA2048 "
	nonceStr := genRandStr(20)
	timestamp := time.Now().Unix()
	fi := strconv.FormatInt(timestamp, 10)
	message := wxBuildMessage(method, parse, timestamp, nonceStr, body)
	sign := rsaSign(message, privateKey, crypto.SHA1)
	return au + "mchid=\"" + merchantId + "\"," +
		"nonce_str=\"" + nonceStr + "\"," +
		"timestamp=\"" + fi + "\"," +
		"serial_no=\"" + serialNo + "\"," +
		"signature=\"" + sign + "\""
}

// 微信证书
type WxCertificate struct {
}
